package DAO;




import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;


import Beans.MesaBean;
import Beans.MozoBean;
import Beans.SectorBean;
import Controller.AdministradorMozo;
import Controller.AdministradorSector;
import DTO.MesaDTO;
import DTO.SectorDTO;
import HibernateUtils.HibernateUtil;
import Model.Mesa;
import Model.Mozo;
import Model.Sector;



public class HibernateSectorDAO {
	
	private static HibernateSectorDAO instancia = null;
	private static SessionFactory sf = null;

	public static HibernateSectorDAO getInstancia(){
		if(instancia == null){
			sf = HibernateUtil.getSessionFactory();
			instancia = new HibernateSectorDAO();
		} 
		return instancia;
	}
	
	public void grabarSector(SectorBean s){
		/*Convierto el parametro a bean
		SectorBean aux = new SectorBean();
		aux.setNombre(s.getNombre());
		
		for(MesaDTO m:s.getMesas()){
			MesaBean mesa=new MesaBean();
			mesa.setCapacidad(m.getCapacidad());
			mesa.setNumero(m.getNumero());
			aux.addMesa(mesa);*/
						
		
		/*Abro sesion y grabo el objeto*/
		Session session = sf.openSession();
		session.beginTransaction();
		session.persist(s);
		session.flush();
		session.getTransaction().commit();
		session.close();
	}

	public List<Sector> getSectores(int idSalon) {
		Session session=sf.openSession();
		
		
		List<SectorBean>aux=session.createQuery("select sec from SalonBean s join s.sectores sec where s.idSalon=?").setInteger(0, idSalon).list();
		
		List<Sector>sectores=AdministradorSector.getInstancia().fromBeanTOModel(aux);
		
		/*for(SectorBean sb:aux){
			Sector s=new Sector();
			s.setNombre(sb.getNombre());
			s.setIdSector(sb.getIdSector());

			for(MesaBean m:sb.getMesas()){
				Mesa mesa=new Mesa();
				mesa.setCapacidad(m.getCapacidad());
				mesa.setNumero(m.getNumero());
				s.agregarMesa(mesa);


			}
			sectores.add(s);
		}*/
		session.close();
		return sectores;
	}

	public Mozo getMozo(List<Mesa> mesasParaAbrir) {
		Mesa m=mesasParaAbrir.get(0);
		Session session=sf.openSession();
		List<MozoBean>mozos= session.createQuery("select moz from SectorBean s join s.mesas m join s.mozos moz where m.numero=?").setInteger(0, m.getNumero()).list();
		return AdministradorMozo.getInstancia().fromBeanTOModel(mozos.get(0));
	}
	
	//me devuelve el mozo que menos mesas esta atendiendo del sector de la mesa que se quiere abrir
	public Mozo getMozoMasLibre(List<Mesa> mesasParaAbrir){
		Mesa m=mesasParaAbrir.get(0);
		Session session=sf.openSession();
		//obtengo el sector de la mesa
		Query q=session.createQuery("select s from SectorBean s join s.mesas m where m.numero=?" ).setInteger(0, m.getNumero());
		SectorBean sb=(SectorBean)q.uniqueResult();
		
		//obtengo las mesas de ese sector
		Query q2=session.createQuery("select m from SectorBean s join s.mesas m where s.idSector=?").setInteger(0, sb.getIdSector());
		List<Object>mesas=q2.list();
		Query q3=session.createQuery("select moz.idEmpleado from SucursalBean s join s.salon sal "
				+ "  join sal.sectores sec join sec.mozos moz left join s.ventas v "
				+ " where v.estado=? and sec.idSector=? "
				+ "	group by moz.idEmpleado order by count(*) desc ").setString(0, "abierta").setInteger(1, sb.getIdSector());
	
		
		q3.setFirstResult(0);
		q3.setMaxResults(1);
		Object o=q3.uniqueResult();
		if(o ==null)
			return this.getMozo(mesasParaAbrir);
		
		int idMozo=(Integer)o;
		MozoBean mb=new MozoBean();
		mb.setIdEmpleado(idMozo);
		
		return AdministradorMozo.getInstancia().fromBeanTOModel(HibernateMozoDAO.getInstancia().buscarMozo(mb));
	}

	public SectorBean buscarSector(SectorBean ab) {
		Session session=sf.openSession();
		SectorBean sector=(SectorBean) session.get(SectorBean.class,ab.getIdSector());
		session.close();
		return sector;
	}

}
